﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

//匿名结构体
struct
{
	char c;
	int a;
	double d;
}s1 = { 'a',12,3.14 }, s2;//匿名结构体的定义和初始化只有在struct后这一种方式
//可以把这种初始化和定义方式的局限性理解成匿名结构体的一次性

struct
{
	char c;
	int a;
	double d;
}s3, * p;

//能不能想个方法让匿名结构体不再有一次性？
typedef struct
{
	char c;
	int a;
}S;//注意，这里的S不是变量名，而是这个结构体的类型名
//严格意义上来说，这样的写法已经不叫匿名结构体了，因为已经用typedef给结构体起了名字

int main()
{
	s2.c = 'q';
	s3.c = 'q';
	//下面三种写法都是错误的
	//struct s1;//struct不是s1的类型名，s1是匿名的
	//struct s1 = { 'a',12,3.14 };//同上
	//s1 = { 'a',12,3.14 };//这样的写法只能出现在初始化中
	//之后要改变结构体成员变量的值只能一个一个变量改，和数组一样
	printf("s1:%c,%d,%lf\n", s1.c, s1.a, s1.d);
	printf("%c\n", s2.c);
	printf("%c\n", s3.c);

	s2.c = 'a';//一次性并不是说不能修改成员变量的值
	printf("%c\n", s2.c);
	
	S s4 = { 'q',12 };//可以初始化
	S s5;//可以定义
	printf("s4:%c,%d\n", s4.c, s4.a);

	p = &s1;//这样的写法不合法
	//虽然两种结构类型完全相同，但由于结构体匿名，所以编译器会把两个声明当做完全不同的两种类型
	return 0;
}


